package com.chenxbook.modules.jbpm4.assign;

import org.jbpm.api.TaskService;
import org.jbpm.api.cmd.Command;
import org.jbpm.api.cmd.Environment;
import org.jbpm.api.task.Participation;
import org.jbpm.api.task.Task;

public class TaskDelegateCmd implements Command<Void> {

    private String taskId;
    private String delegateUserId;


    public TaskDelegateCmd(String taskId, String delegateUserId) {
        this.taskId = taskId;
        this.delegateUserId = delegateUserId;
    }

    /**
     * 执行任务委派
     *
     * <br> TaskService的addTaskParticipatingUser方法将任务的原始分配人作为一种特定的参与者类型与任务建立关联。
     * <br> TaskService的addTaskComment方法为任务添加关于代理的注释，以备历史追溯之需。
     */
    @Override
    public Void execute(Environment environment) throws Exception {
        //获取TaskService服务
        TaskService taskService = environment.get(TaskService.class);
        //获取需要委派的任务对象
        Task task = taskService.getTask(taskId);
        //Participation.REPLACED_ASSIGNEE: 表示此用户是该任务原始的分配者，但由于缺席或者其他某些原因被替换了。
        //此处设置为Participation.REPLACED_ASSIGNEE，是为了日后当此用户方便时将该任务"还"给他
        taskService.addTaskParticipatingUser(taskId, task.getAssignee(), Participation.REPLACED_ASSIGNEE);
        //为任务增加一条注释，记录委派的明细，以备历史查询所用
        taskService.addTaskComment(taskId, "Delegate task from " + task.getAssignee() + " to " + delegateUserId);
        //将任务的分配者设置为委派用户
        task.setAssignee(delegateUserId);
        //保存任务对象的改动保存，持久化之
        taskService.saveTask(task);
        return null;
    }
}
